#https://leetcode.cn/problems/house-robber-ii/submissions/562704351/

class Solution {
public:
    int robRange(vector<int>& nums, int w, int end) {
        int sd = nums[w], df = max(nums[w], nums[w + 1]);
        // 从第三个位置开始迭代计算
        for (int i = w + 2; i <= end; i++) {
            // 临时保存当前的最大值
            int qqq = df;
            // 更新当前最大值为前一个位置的最大值与前前一个位置加上当前位置的值之间的较大值
            df = max(sd + nums[i], df);
            // 更新前一个位置的值
            sd = qqq;
        }
        return df;
    }

    int rob(vector<int>& nums) {
        int changdu = nums.size();
        // 特殊情况处理
        if (changdu == 1) {
            return nums[0];
        } else if (changdu == 2) {
            return max(nums[0], nums[1]);
        }
        // 分别计算不抢劫第一个房子和不抢劫最后一个房子的情况
        // 取两者的较大值作为最终结果
        return max(robRange(nums, 0, length - 2), robRange(nums, 1, length - 1));
    }
};